#include "loginwindow.h"

#include <QDebug>
#include <QMessageBox>
#include <QSettings>
#include <QSqlError>
#include <QStyle>

#include "Database.h"
#include "ui_loginwindow.h"

LoginWindow::LoginWindow(QWidget *parent)
    : QDialog(parent), ui(new Ui::LoginWindow) {
    ui->setupUi(this);

    setWindowTitle("登录");

    // 设置窗口大小以及图标
    setFixedSize(300, 370);
    QStyle *style = QApplication::style();
    QIcon picture = style->standardIcon(QStyle::SP_DesktopIcon);
    setWindowIcon(picture);

    // 登录页面不需要重复密码，同时禁止注册成为管理员
    ui->label3->hide();    // 重复密码的标签
    ui->repeat->hide();    // 重复密码的输入框
    ui->return_2->hide();  // 返回登录页面的按钮

    // disable掉，让这些控件无法被点击
    ui->repeat->setDisabled(true);
    ui->repeat->setDisabled(true);
    ui->return_2->setDisabled(true);

    // 设置默认按钮为登录
    ui->login->setFocus();
}

LoginWindow::~LoginWindow() { delete ui; }

void LoginWindow::on_register_2_clicked() {
    // 显示标签和按钮
    ui->label3->show();
    ui->repeat->show();
    ui->return_2->show();

    // 让这些控件可以被点击
    ui->label3->setEnabled(true);
    ui->repeat->setEnabled(true);
    ui->return_2->setEnabled(true);

    // 隐藏 我是管理员 的选择框，防止用户注册成为管理员
    // 其实程序逻辑也不可能让学生注册成为管理员
    ui->is_admin->hide();
    ui->is_admin->setDisabled(true);

    // 将登录按钮的文字改为 注册新用户
    ui->login->setText("注册新用户");

    // 测试用，没什么意义，release的时候会自动清掉
    qDebug() << "repeat enabled: " << ui->repeat->isEnabled();
}

void LoginWindow::on_return_2_clicked() {
    // 打开选择框
    ui->is_admin->show();
    ui->is_admin->setEnabled(true);

    // 登录页面不需要重复密码，同时禁止注册成为管理员
    ui->label3->hide();
    ui->repeat->hide();
    ui->return_2->hide();

    // disable掉，让这些控件无法被点击
    ui->repeat->setDisabled(true);
    ui->repeat->setDisabled(true);
    ui->return_2->setDisabled(true);

    // 将login按钮文字更改回登录
    ui->login->setText("登录");
}

void LoginWindow::on_cancel_clicked() {
    // 取消按钮被按下，直接退出
    this->reject();
}

void LoginWindow::on_login_clicked() {
    // 登录按钮被按下
    if (ui->is_admin->isEnabled()) {
        qDebug() << "进入登录的流程";
        QString account = ui->account->text();
        QString password = ui->password->text();

        if (account.length() == 0) {
            QMessageBox::warning(this, "用户名错误", "用户名不能为空");
            return;
        }

        if (password.length() == 0) {
            QMessageBox::warning(this, "密码错误", "密码不能为空");
            return;
        }

        // 打开数据库，实际走SQL了
        Database *database = Database::getInstance();
        database->connectDatabase();
        database->openDatabase();
        if (!database->isDatabaseOpen()) {
            QMessageBox::critical(this, "错误", "数据库连接失败");
            this->reject();
        }

        QString sql;
        QString tableName;
        bool
            isAdmin;  // 这个是用来判断是不是以管理员的身份登录，为了和主窗口建立联系
        if (ui->is_admin->isChecked()) {
            tableName = "admin_info";
            isAdmin = true;
        } else {
            tableName = "student_info";
            isAdmin = false;
        }

        // SELECT password FROM admin_info WHERE account='root';
        sql = QString("SELECT password FROM") + QString(" ") + tableName +
              QString(" ") + QString("WHERE account='") + account +
              QString("';");
        qDebug() << sql;

        if (!database->exec(sql)) {
            QMessageBox::critical(this, "错误", "程序内部错误");
            this->reject();
        } else {
            QSqlQuery *query = database->getQuery();
            // 获取数据库中的密码，与用户输入进行比对
            if (!query->next()) {
                QMessageBox::warning(this, "错误", "用户不存在");
                ui->account->clear();
                ui->password->clear();
                return;
            }
            QString result = query->value(0).toString();
            if (result != password) {
                qDebug() << query->lastError();
                // 登录失败
                QMessageBox::warning(this, "错误",
                                     "用户名或密码错误，请重新输入");

                // 清空输入
                ui->account->clear();
                ui->password->clear();
                return;
            }

            // 写入信息：账号和是否为管理员
            QSettings config("./login.ini", QSettings::IniFormat);
            config.beginGroup("login");
            config.setValue("account", account);
            config.setValue("is_admin", isAdmin);
            config.endGroup();

            qDebug() << "登录成功" << endl
                     << "用户名为：" << account << endl
                     << "是否为管理员" << isAdmin;
            database->closeDatabase();
            this->accept();
        }
    } else if (ui->return_2->isEnabled()) {
        // 表示新用户注册
        qDebug() << "进入注册的流程";

        QString account = ui->account->text();
        QString password = ui->password->text();
        QString repeat = ui->repeat->text();

        // 如果用户名或密码为空
        if (account.length() == 0) {
            QMessageBox::warning(this, "用户名错误", "用户名不能为空");
            return;
        }
        // 如果两次输入密码之中有一个为空
        if (password.length() == 0 or repeat.length() == 0) {
            QMessageBox::warning(this, "密码错误",
                                 "密码和重复密码不能为空，请重新输入");
            // 清空输入
            ui->password->clear();
            ui->repeat->clear();
            return;
        }
        // 如果两次输入密码不一致
        if (!(password == repeat)) {
            QMessageBox::warning(this, "密码错误",
                                 "两次密码不一致，请重新输入密码");
            ui->password->clear();
            ui->repeat->clear();
            return;
        }

        Database *database = Database::getInstance();
        database->connectDatabase();
        database->openDatabase();
        if (!database->isDatabaseOpen()) {
            QMessageBox::critical(this, "错误", "数据库连接失败");
            this->reject();
        }

        // INSERT INTO student_info VALUES(null, null, '20194780', '20194780',
        // 2, null);
        QString sql = QString("INSERT INTO student_info VALUES(null, null, '" +
                              account + "', '" + password + "', 2, 0);");

        if (!database->exec(sql)) {
            // 这里尽量保证SQL不会出错吧
            QMessageBox::warning(this, "账号错误",
                                 "当前账号已经存在，请使用新的账号注册");
            // 清空输入，并且返回
            ui->account->clear();
            ui->password->clear();
            ui->repeat->clear();
            database->closeDatabase();
            return;
        } else {
            // 登录成功，使用配置文件记录当前登录人的信息，文件名current.ini
            qDebug() << "成功创建新用户";
            QSettings config("./login.ini", QSettings::IniFormat);
            config.beginGroup("login");
            config.setValue("account", account);
            config.setValue("is_admin", false);
            config.endGroup();
            database->closeDatabase();  // 关闭数据库的连接
            accept();
        }
    }
}
